# -*- coding: utf-8 -*-
# @Time    : 2024/6/21 17:45
# @Author  : yujiahao
# @File    : 03_pandas_panel.py
# @description:Pandas Panel三维数据结构

'''
Panel 结构也称“面板结构”，它源自于 Panel Data 一词，翻译为“面板数据”。如果使用Pandas 0.25 以前的版本需要掌握，否则，了解就行

【自 Pandas 0.25 版本后， Panel 结构已经被废弃】

Panel 是一个用来承载数据的三维数据结构，它有三个轴，分别是 items（0 轴），major_axis（1 轴），而 minor_axis（2 轴）。
这三个轴为描述、操作 Panel 提供了支持，其作用介绍如下：

    - items：axis =0，Panel 中的每个 items 都对应一个 DataFrame。
    - major_axis：axis=1，用来描述每个 DataFrame 的行索引。
    - minor_axis：axis=2，用来描述每个 DataFrame 的列索引。

可以使用以下构造函数创建一个 Panel：

    pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)

    参数说明如下：
    - data: 输入数据，可以是 ndarray，Series，列表，字典，或者 DataFrame。
    - items: axis=0
    - major_axis: axis=1
    - minor_axis: axis=2
    - dtype: 每一列的数据类型。
    - copy: 默认为 False，表示是否复制数据。
'''

import pandas as pd
import numpy as np


def create_empty_panel():
    """
    创建一个空的 Panel 对象。
    """
    # 注意：自 Pandas 0.25 版本起，Panel 已被废弃
    p = pd.Panel()
    print("创建一个空的 Panel 对象：")
    print(p)
    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')


def create_panel_from_ndarray():
    """
    使用 ndarray 三维数组创建一个 Panel 对象。

    data: 三维 ndarray 数据。
    """
    data = np.random.rand(2, 4, 5)
    p = pd.Panel(data)
    print("使用 ndarray 三维数组创建一个 Panel 对象：")
    print(p)
    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')


def create_panel_from_dataframe():
    """
    使用 DataFrame 创建一个 Panel 对象。

    data: 包含多个 DataFrame 的字典，每个 DataFrame 代表一个 item。
    """
    data = {
        'Item1': pd.DataFrame(np.random.randn(4, 3)),
        'Item2': pd.DataFrame(np.random.randn(4, 2))
    }
    p = pd.Panel(data)
    print("使用 DataFrame 创建一个 Panel 对象：")
    print(p)
    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')


def select_data_from_panel():
    """
    从 Panel 对象中选取数据。

    可以使用 Panel 的三个轴：items，major_axis，minor_axis 进行数据选取。
    """
    data = {
        'Item1': pd.DataFrame(np.random.randn(4, 3)),
        'Item2': pd.DataFrame(np.random.randn(4, 2))
    }
    p = pd.Panel(data)
    print("从 Panel 对象中选取数据：")
    print("选取 'Item1' 的数据：")
    print(p['Item1'])
    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')


if __name__ == "__main__":
    # 创建空 Panel
    create_empty_panel()

    # 使用 ndarray 三维数组创建 Panel
    create_panel_from_ndarray()

    # 使用 DataFrame 创建 Panel
    create_panel_from_dataframe()

    # 从 Panel 中选取数据
    select_data_from_panel()